<?php
/**
 * 这里就是请求进来以后，创建一个task，目前开启了4个进程，那么会让前4个task执行完某一个以后，才会创建后面的task
 * 每个task进来都会触发task事件，可以根据$data内容的不同，去执行不同的任务
 * 执行完以后调Finish方法，如果data对应的任务不需要执行任务，那么可以省略。
 */
$http = new Swoole\Http\Server("0.0.0.0", 8090);
$http->set([
    'task_worker_num' => 4
]);
$http->on('request', function ($request, $response) use ($http) {
    echo "接收到了请求", PHP_EOL;
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $http->task("发送邮件");
    $http->task("发送广播");
    $http->task("执行队列");
    $http->task("发送邮件");
    $http->task("发送广播");
    $http->task("执行队列");
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});

//处理异步任务(此回调函数在task进程中执行)
$http->on('Task',function ($serv, $task_id, $reactor_id, $data) {
    echo "新任务开始[id={$task_id}]".PHP_EOL;
    $time = rand(1,5);
    echo "休眠时间[id={$task_id}] : {$time}" . PHP_EOL;
    sleep($time);
    $serv->finish("{$data} -> OK");
});

$http->on('Finish', function ($serv, $task_id, $data) {
    echo "异步任务完成[{$task_id}] 完成: {$data}".PHP_EOL;
});

echo "服务启动", PHP_EOL;
$http->start();